package ar.fiuba.tp7552.buildadmin.service.impl;

import java.util.Collection;

import org.springframework.transaction.annotation.Transactional;

import ar.fiuba.tp7552.buildadmin.dao.PropiedadDao;
import ar.fiuba.tp7552.buildadmin.dao.ResponsableDao;
import ar.fiuba.tp7552.buildadmin.model.BusinessException;
import ar.fiuba.tp7552.buildadmin.model.builds.Edificio;
import ar.fiuba.tp7552.buildadmin.model.builds.Propiedad;
import ar.fiuba.tp7552.buildadmin.model.builds.PropiedadCriteria;
import ar.fiuba.tp7552.buildadmin.model.builds.Responsable;
import ar.fiuba.tp7552.buildadmin.service.PropiedadService;

@Transactional
public class PropiedadServiceImpl implements PropiedadService {

	private PropiedadDao propiedadDao;
	private ResponsableDao responsableDao;

	public PropiedadServiceImpl(PropiedadDao propiedadDao, ResponsableDao responsableDao) {
		super();
		this.propiedadDao = propiedadDao;
		this.responsableDao = responsableDao;
	}

	@Override
	public void createPropiedad (Propiedad propiedad) throws BusinessException {
		if (propiedad.getPropietario() != null && propiedad.getPropietario().isNew()) {
			responsableDao.save(propiedad.getPropietario());
		}
		if (propiedad.getInquilino() != null && propiedad.getInquilino().isNew()) {
			responsableDao.save(propiedad.getInquilino());
		}
		if (propiedad.getApoderado() != null && propiedad.getApoderado().isNew()) {
			responsableDao.save(propiedad.getApoderado());
		}
		propiedadDao.save(propiedad);
	}
	
	@Override
	public Collection<Propiedad> getAll() {
		return propiedadDao.getAll();
	}

	@Override
	public void update(Propiedad propiedad) {
		if (propiedad.getPropietario() != null && propiedad.getPropietario().isNew()) {
			responsableDao.save(propiedad.getPropietario());
		}
		if (propiedad.getInquilino() != null && propiedad.getInquilino().isNew()) {
			responsableDao.save(propiedad.getInquilino());
		}
		if (propiedad.getApoderado() != null && propiedad.getApoderado().isNew()) {
			responsableDao.save(propiedad.getApoderado());
		}
		propiedadDao.update(propiedad);
	}

	@Override
	public Propiedad get(Long id) {
		return propiedadDao.get(id);
	}
	
	@Override
	public void delete(Propiedad propiedad) {
		propiedadDao.remove(propiedad.getId());
	}

	@Override
	public Collection<Propiedad> getAll(Edificio edificio) {
		return propiedadDao.getAll(edificio);
	}

	@Override
	public Collection<Propiedad> find(PropiedadCriteria criteria) {
		return propiedadDao.find(criteria);
	}

	@Override
	public Collection<Propiedad> findPropiedades(Edificio edificio,Responsable responsable) {
		return propiedadDao.find(edificio, responsable);
	}
}
